package main

import "fmt"

/*
值传递和引用传递
1.值传递,需要拷贝值进行传递,影响执行效率;但完全不影响原值
*/

func main() {
	a := 3
	pass_by_val(a)
	fmt.Println("After pass_by_val, a=", a)
	fmt.Println()

	//使用 & 取地址
	pass_by_ref(&a)
	fmt.Println("After pass_by_ref, a=", a)
	fmt.Println()

	b, c := 4, 7
	fmt.Println("b=", b, "c=", c)
	swap(&b, &c)
	fmt.Println("b=", b, "c=", c)
	fmt.Println()

	b, c = swap2(b, c)
	fmt.Println("b=", b, "c=", c)
	fmt.Println()

	//Go语言中五个引用类型变量(其他都是值类型)
	//slice
	//map
	//channel
	//interface
	//func()
	intSlice := []int64{1, 2, 3, 4, 5}
	fmt.Println(intSlice)
	alterSlice(intSlice)
	fmt.Println(intSlice)
}

//值传递
func pass_by_val(a int) {
	a++
}

//引用传递
//*表示指针类型, 使用 * 取地址对应的值
func pass_by_ref(a *int) {
	*a++
}

//指针传递方式交换
func swap(a, b *int) {
	*b, *a = *a, *b
}

//不使用指针传递方式进行交换
func swap2(a, b int) (int, int) {
	return b, a
}

func alterSlice(intSlice []int64) {
	intSlice[0] = 9
}
